<?php
/**
 * $Id: pdo.php 19 2009-06-08 08:45:14Z eyou80 $
 */

/** 载入适配器接口 **/
require_once 'Tinyask/db/adapter.php';

/**
 * 数据库Pdo适配器抽象类
 *
 * @package Db
 */
abstract class Tinyask_Db_Adapter_Pdo implements Tinyask_Db_Adapter
{
	/**
	 * 数据库对象
	 *
	 * @var PDO
	 */
	protected $_object;

	/**
	 * 最后一次操作的数据表
	 *
	 * @var string
	 */
	protected $_lastTable;

	/**
	 * 判断适配器是否可用
	 *
	 * @return boolean
	 */
	public static function isAvailable()
	{
		return extension_loaded('pdo');
	}

	/**
	 * 数据库连接
	 *
	 * @param Tinyask_Config $config
	 * @throws Tinyask_Db_Exception
	 * @return PDO
	 */
	public function connect(Tinyask_Config $config)
	{
		try {
			$this->_object = $this->init($config);
			$this->_object->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} catch(PDOException $e) {
			throw new Tinyask_Db_Exception($e->getMessage());
		}

		return $this->_object;
	}

	/**
	 * 数据库连接
	 *
	 * @abstract
	 * @param Tinyask_Config $config
	 * @return PDO
	 */
	abstract public function init(Tinyask_Config $config);

	/**
	 * 执行查询
	 *
	 * @param mixed $sql
	 * @param string $action
	 * @param PDO $handle
	 * @throws Tinyask_Db_Exception
	 * @return PDOStatement object
	 */
	public function query($sql, $action, $handle)
	{
		try {
			$isSqlObject  = $sql instanceof Tinyask_Sql;
			$this->_lastTable = $isSqlObject ? $sql->getAttribute('table') : null;
			$resource = $handle->prepare($isSqlObject ? $sql->__toString() : $sql);
			$resource->execute();
		} catch(PDOException $e) {
			throw new Tinyask_Db_Exception($e->getMessage(), $e->getCode());
		}

		return $resource;
	}

	/**
	 * 将数据查询的其中一行作为数组取出,其中字段名对应数组键值
	 *
	 * @param PDOStatement object $resource
	 * @return array
	 */
	public function fetch($resource)
	{
		return $resource->fetch(PDO::FETCH_ASSOC);
	}

	/**
	 * 将数据查询的其中一行作为对象取出,其中字段名对应对象属性
	 *
	 * @param PDOStatement object $resource
	 * @return object
	 */
	public function fetchObject($resource)
	{
		return $resource->fetchObject();
	}

	/**
	 * 转义值
	 *
	 * @param string $string
	 * @return string
	 */
	public function quoteValue($string)
	{
		return $this->_object->quote($string);
	}

	/**
	 * 转义字段名称
	 *
	 * @param string $string
	 * @return string
	 */
	public function quoteField($string){}

	/**
	 * 合成sql查询语句
	 *
	 * @param array $sql
	 * @return string
	 */
	public function mergeSelect(array $sql){}

	/**
	 * 取出最后一次查询影响的行数
	 *
	 * @param PDOStatement object $resource
	 * @param PDO $handle
	 * @return integer
	 */
	public function affectedRows($resource, $handle)
	{
		return $resource->rowCount();
	}

	/**
	 * 取出最后一次插入返回的主键值
	 *
	 * @param PDOStatement object $resource
	 * @param PDO $handle
	 * @return integer
	 */
	public function lastInsertId($resource, $handle)
	{
		return $handle->lastInsertId();
	}
}
